package app;

import callBack.impl.FileSave2DB;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.stage.DirectoryChooser;
import javafx.stage.Window;
import task.FileScanner;
import task.FileSearch;
import util.DBInit;

import java.io.File;
import java.net.URL;
import java.util.List;
import java.util.ResourceBundle;

/**
 *界面的控制文件
 */
public class Controller implements Initializable {

    @FXML
    private GridPane rootPane;

    @FXML
    private TextField searchField;

    @FXML
    private TableView<FileMeta> fileTable;

    private List<FileMeta> fileMetas;
    @FXML
    private Label srcDirectory;
    //点击运行项目，界面初始化时的一个加载方法，在界面出现之前加载一些必要的操作
    public void initialize(URL location, ResourceBundle resources) {
        //调用DBInit，在界面初始化时初始化数据库，创建数据表
        DBInit.init();
        // 添加搜索框监听器，内容改变时执行监听事件
        //当界面的内容出现修改时，就会刷新页面
        searchField.textProperty().addListener(new ChangeListener<String>() {
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                freshTable();
            }
        });
    }

    /**
     * 对应app.fxml中的选择目录按钮操作
     * 点击选择目录后，就会获取到最终界面上选择的是那个文件夹
     * @param event
     */
    public void choose(Event event) {
        // 选择文件目录
        DirectoryChooser directoryChooser=new DirectoryChooser();
        Window window = rootPane.getScene().getWindow();
        File file = directoryChooser.showDialog(window);
        if(file == null)
            return;
        // 获取选择的目录路径，并显示
        String path = file.getPath();
        //在界面中显示路径的内容
        this.srcDirectory.setText(path);
        //获取要扫描的文件夹路径后，进行文件扫描工作
        System.out.println("开始文件扫描任务，根路径为:"+path);
        long start=System.nanoTime();
        //此处进行文件扫描时，就要决定信息保存到哪里
        //保存到数据库中
        FileScanner fileScanner=new FileScanner( new FileSave2DB());
        fileScanner.scan(file);
        long end=System.nanoTime();
        System.out.println("文件扫描任务结束，共耗时:"+(end-start)/1000000+"ms");
        System.out.println("共扫描到:"+fileScanner.getDirNum()+"个文件夹");
        System.out.println("共扫描到:"+fileScanner.getFileNum()+"个文件");
        //获取到所以有扫描的文件内容
//        this.fileMetas=fileScanner.getFileMetas();
        // TODO  刷新界面，展示刚才扫描到的文件信息
        freshTable();
    }

    // 刷新表格数据
    private void freshTable(){
        ObservableList<FileMeta> metas = fileTable.getItems();
        metas.clear();
        // TODO  扫描文件夹之后刷新界面
         String dir=srcDirectory.getText();
         if (dir !=null && dir.trim().length()!=0){
             //界面中已经选择了文件，此时已经将最新的数据保存到了数据库中
             //只需要取出数据库中的内容展示到界面即可
             //获取用户在搜索框的内容
             String content=searchField.getText();
             //根据选择的路径+用户在搜索框输入的内容(若为空就展示所有内容)，将数据库中的指定内容刷新到数据库中
             List<FileMeta> filesFromDB = FileSearch.search(dir,content);
             metas.addAll(filesFromDB);
         }
    }

}